package cn.com.se.业务工具.导入汀汀环评数据;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.compress.utils.Lists;

import java.math.BigInteger;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;

public class 生成汀汀环评数据SQL {

    // 存储题目基础数据，键为题目 ID，值为包含题目类型、编号、序号等信息的 Map
    private static final Map<String, Map<String, String>> QUESTION_BASE_DATA = new HashMap<>();
    // 存储题目与选项关系数据，键为题目 ID，值为选项编号到选项得分的 Map
    private static final Map<String, Map<Integer, String>> QUESTION_OPTION_DATA = new HashMap<>();
    // 存储任务基础数据，键为被评价人姓名，值为包含任务ID、被评价人 ID、被考核人考核 ID 等信息的 Map
    private static final Map<String, Map<String, String>> TASK_BASE_DATA = new HashMap<>();
    // 存储考核结果基础数据，键为被评价人姓名，值为包含各题答案的列表
    private static final Map<String, List<String>> ASSESSMENT_RESULT_DATA = new HashMap<>();

    public static void main(String[] args) {
        // 初始化各类数据
        initQuestionBaseData();
        initQuestionOptionData();
        initTaskBaseData();
        initAssessmentResultData();

        // 获取当前时间，格式为 yyyy-MM-dd HH:mm:ss
        String currentDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        List<String> sqlList = Lists.newArrayList();

        // 遍历考核结果数据
        for (Map.Entry<String, List<String>> entry : ASSESSMENT_RESULT_DATA.entrySet()) {
            String evaluatedPerson = entry.getKey();
            List<String> answers = entry.getValue();
            // 获取任务 ID
            String taskId = TASK_BASE_DATA.get(evaluatedPerson).get("task_id");
            // 获取被评价人 ID
            String beEvaluatedId = TASK_BASE_DATA.get(evaluatedPerson).get("be_evaluate_id");
            // 评价人 ID
            String evaluatedId = TASK_BASE_DATA.get(evaluatedPerson).get("evaluate_id");
            // 获取被考核人考核 ID
            String checkId = TASK_BASE_DATA.get(evaluatedPerson).get("check_id");

            // 遍历每个题目的答案
            for (int i = 0; i < answers.size(); i++) {
                String answer = answers.get(i);
                String questionSerialNumber = String.valueOf(i + 1);
                // 根据题目序号获取题目 ID
                String questionId = getQuestionIdBySerialNumber(questionSerialNumber);
                // 根据题目 ID 获取题目编号
                String actionId = QUESTION_BASE_DATA.get(questionId).get("action_id");
                // 获取题目类型
                String questionType = QUESTION_BASE_DATA.get(questionId).get("question_type");

                String questionAnswer;
                String optionAnswer;
                if ("2".equals(questionType)) { // 简答题
                    questionAnswer = answer;
                    optionAnswer = null;
                } else { // 问答题
                    // 将答案（ABCD）转换为选项编号
                    int optionNumber = convertAnswerToOptionNumber(answer);
                    // 根据题目 ID 和选项编号获取选项得分
                    questionAnswer = QUESTION_OPTION_DATA.get(questionId).get(optionNumber);
                    optionAnswer = String.valueOf(optionNumber);
                }

                // 生成唯一的主键 ID
                String id = generateUniqueId();
                // 生成插入 SQL 语句
                String sql = generateInsertSql(id, taskId, actionId, evaluatedId, beEvaluatedId,
                        questionAnswer, questionId, optionAnswer, currentDate, checkId);
                sqlList.add(sql);
            }
        }

        sqlList.forEach(System.out::println);
    }

    // 初始化题目基础数据
    private static void initQuestionBaseData() {
        String[] questionLines = {
                "924348279970867202,1,在我的视角中，该同事是否存在违背价值观的行为。,SYGJ_JZG,1",
                "924348280042170370,1,在我的视角中，该同事是否将价值观作为工作准则并落地运用。,SYGJ_JZG,2",
                "924348280142833666,1,在我的视角中，该同事是否积极践行价值观并有令我印象深刻的正面案例。,SYGJ_JZG,3",
                "924349137555040258,1,在我的视角中，该同事是否理解人才观三大特质（皮实、智慧、自省）。,SYGJ_RCG,4",
                "924349137630537730,1,在我的视角中，该同事在人才观三大特质中是否有正向事例。,SYGJ_RCG,5",
                "924349137722812418,1,在我的视角中，该同事近半年的成长是否能很好的体现核心人才观”人成事事成人”。,SYGJ_RCG,6",
                "924349834593839106,1,在我的视角中，该同事是否具备基本的水羊职业化素养。,SYGJ_ZYH,7",
                "924349834669336578,1,在我的视角中，该同事是否践行水羊职业化要求。,SYGJ_ZYH,8",
                "924349834757416962,1,在我的视角中，该同事是否有令我印象深刻的职业化正面案例。,SYGJ_ZYH,9",
                "924340985493202946,2,请结合该同学半年度内协作情况，对TA进行文化综合评价并提出建议，从而帮助该TA更好地认知自我及成长。,SYGJ_EIAPUBLIC,10"
        };
        for (String line : questionLines) {
            String[] parts = line.split(",");
            Map<String, String> questionInfo = new HashMap<>();
            questionInfo.put("question_type", parts[1]);
            questionInfo.put("action_id", parts[3]);
            questionInfo.put("question_serial_number", parts[4]);
            QUESTION_BASE_DATA.put(parts[0], questionInfo);
        }
    }

    // 初始化题目与选项关系数据
    private static void initQuestionOptionData() {
        String[] optionLines = {
                "924348279970867202,1,在我的视角中，该同事是否存在违背价值观的行为。,4.00,1",
                "924348279970867202,1,在我的视角中，该同事是否存在违背价值观的行为。,3.00,2",
                "924348279970867202,1,在我的视角中，该同事是否存在违背价值观的行为。,0.00,3",
                "924348280042170370,1,在我的视角中，该同事是否将价值观作为工作准则并落地运用。,3.00,1",
                "924348280042170370,1,在我的视角中，该同事是否将价值观作为工作准则并落地运用。,2.50,2",
                "924348280042170370,1,在我的视角中，该同事是否将价值观作为工作准则并落地运用。,1.50,3",
                "924348280042170370,1,在我的视角中，该同事是否将价值观作为工作准则并落地运用。,0.50,4",
                "924348280142833666,1,在我的视角中，该同事是否积极践行价值观并有令我印象深刻的正面案例。,3.00,1",
                "924348280142833666,1,在我的视角中，该同事是否积极践行价值观并有令我印象深刻的正面案例。,2.50,2",
                "924348280142833666,1,在我的视角中，该同事是否积极践行价值观并有令我印象深刻的正面案例。,1.50,3",
                "924348280142833666,1,在我的视角中，该同事是否积极践行价值观并有令我印象深刻的正面案例。,0.00,4",
                "924349137555040258,1,在我的视角中，该同事是否理解人才观三大特质（皮实、智慧、自省）。,4.00,1",
                "924349137555040258,1,在我的视角中，该同事是否理解人才观三大特质（皮实、智慧、自省）。,3.00,2",
                "924349137555040258,1,在我的视角中，该同事是否理解人才观三大特质（皮实、智慧、自省）。,0.00,3",
                "924349137630537730,1,在我的视角中，该同事在人才观三大特质中是否有正向事例。,3.00,1",
                "924349137630537730,1,在我的视角中，该同事在人才观三大特质中是否有正向事例。,2.50,2",
                "924349137630537730,1,在我的视角中，该同事在人才观三大特质中是否有正向事例。,1.50,3",
                "924349137630537730,1,在我的视角中，该同事在人才观三大特质中是否有正向事例。,0.50,4",
                "924349137722812418,1,在我的视角中，该同事近半年的成长是否能很好的体现核心人才观”人成事事成人”。,3.00,1",
                "924349137722812418,1,在我的视角中，该同事近半年的成长是否能很好的体现核心人才观”人成事事成人”。,2.50,2",
                "924349137722812418,1,在我的视角中，该同事近半年的成长是否能很好的体现核心人才观”人成事事成人”。,1.50,3",
                "924349137722812418,1,在我的视角中，该同事近半年的成长是否能很好的体现核心人才观”人成事事成人”。,0.00,4",
                "924349834593839106,1,在我的视角中，该同事是否具备基本的水羊职业化素养。,4.00,1",
                "924349834593839106,1,在我的视角中，该同事是否具备基本的水羊职业化素养。,3.00,2",
                "924349834593839106,1,在我的视角中，该同事是否具备基本的水羊职业化素养。,0.00,3",
                "924349834669336578,1,在我的视角中，该同事是否践行水羊职业化要求。,3.00,1",
                "924349834669336578,1,在我的视角中，该同事是否践行水羊职业化要求。,2.50,2",
                "924349834669336578,1,在我的视角中，该同事是否践行水羊职业化要求。,1.50,3",
                "924349834669336578,1,在我的视角中，该同事是否践行水羊职业化要求。,0.50,4",
                "924349834757416962,1,在我的视角中，该同事是否有令我印象深刻的职业化正面案例。,3.00,1",
                "924349834757416962,1,在我的视角中，该同事是否有令我印象深刻的职业化正面案例。,2.50,2",
                "924349834757416962,1,在我的视角中，该同事是否有令我印象深刻的职业化正面案例。,1.50,3",
                "924349834757416962,1,在我的视角中，该同事是否有令我印象深刻的职业化正面案例。,0.00,4",
                "924340985493202946,2,请结合该同学半年度内协作情况，对TA进行文化综合评价并提出建议，从而帮助该TA更好地认知自我及成长。,(null)"
        };
        for (String line : optionLines) {
            String[] parts = line.split(",");
            String questionId = parts[0];
            if(parts.length < 5) {
                continue;
            }
            int optionNumber = Integer.parseInt(parts[4]);
            String optionScore = parts[3];
            QUESTION_OPTION_DATA.computeIfAbsent(questionId, k -> new HashMap<>()).put(optionNumber, optionScore);
        }
    }

    /**
     *
     */
    // 初始化任务基础数据
    private static void initTaskBaseData() {
        String[] taskLines = {
                /*"927150809658403471,汀汀,子威,691667657323674114,691667555980929282,927150808161036930",
                "927150811222878855,汀汀,无涯,691667981958609410,691667555980929282,927150809746483842",
                "927150812686690957,汀汀,镙钉,691667551870511362,691667555980929282,927150811306764930",
                "927150813580077705,汀汀,玉米,691667557792868610,691667555980929282,927150812770577026",
                "927150814565739142,汀汀,小狼,691667543813253378,691667555980929282,927150813672352386",
                "927150816197323408,汀汀,东方,691667548691200514,691667555980929282,927150814653819522",
                "927150818168646279,汀汀,小小,691667545641969922,691667555980929282,927150817304619650",
                "927150818361584271,汀汀,念念,691667551002262018,691667555980929282,927150818256726658",
                "927150819250776706,汀汀,都可,691667540596193794,691667555980929282,927150818445470338",
                "927150820311935628,汀汀,长征,691667655864084738,691667555980929282,927150819330468482",
                "927150822463613585,汀汀,惊鸿,691667654974863874,691667555980929282,927150820404210306",
                "927150823940008581,汀汀,昕曼,691667544803080706,691667555980929282,927150822551693954",
                "927150825605147278,汀汀,秋风,691667555884460290,691667555980929282,927150824019700354",
                "927500113707244038,汀汀,竹霖,691667981597899266,691667555980929282,927500113614969347",
                "929759333961931285,汀汀,木象,691667653171341570,691667555980929282,929759332753971715",
                "929820962787400196,汀汀,元三,691667553162328578,691667555980929282,929820961629772291",
                "929821104353548805,汀汀,七宝,691667561760680194,691667555980929282,929821103527270915",
                "929821250722175511,汀汀,康妮,691667542949198338,691667555980929282,929821249581324803",
                "944561663383179778,汀汀,粉墨,691667559160183298,691667555980929282,925089957425981442",*/
                "927150817216539282,康妮,香叶,691667653272004866,691667542949198338,927150816281209474"
        };
        for (String line : taskLines) {
            String[] parts = line.split(",");
            Map<String, String> taskInfo = new HashMap<>();
            taskInfo.put("task_id", parts[0]);
            taskInfo.put("be_evaluate_id", parts[3]);
            taskInfo.put("evaluate_id", parts[4]);
            taskInfo.put("check_id", parts[5]);
            TASK_BASE_DATA.put(parts[2], taskInfo);
        }
    }

    /**
     * 考核数据由政委提供
     */
    // 初始化考核结果基础数据
    private static void initAssessmentResultData() {
        String[] assessmentLines = {
                /*"木象,B,C,C,B,B,B,B,B,C,好的：全力以赴，身体力行，皮实正面形象。待改进：对下属管理不够下沉，管理目标的方法欠缺，平台型包容思维太多，品牌精耕细作太少。",
                "子威,B,B,C,B,B,C,B,B,B,好的：全力以赴带领团队拿结果。待改进：“站更高做更细”依然有空间。",
                "康妮,B,B,B,B,B,B,B,B,C,好的：全力以赴，身体力行，坚定执行上级要求。待改进：融入业务团队协助拿结果能力需要提升，需要更高标准提升自我职业素养的空间很大。",
                "玉米,B,C,C,B,B,B,B,C,C,好的：全力以赴，身体力行拿结果。待改进：团队管理存在不担责不自知等问题，向下向上及同级沟通均需提升。",
                "昕曼,B,B,C,B,B,C,B,B,B,好的：全力以赴，身体力行带领团队拿结果，兼容国际化与本土化管理文化差异。待改进：个人认知有进一步打开的空间，对品牌的深刻理解有提升空间。",
                "七宝,B,B,C,B,B,C,B,C,C,好的：比较全力以赴拿结果。待改进：职业化综合素养有提升空间，按时拿结果能力有提升空间。",
                "都可,B,B,C,B,B,C,B,B,C,好的：全力以赴，身体力行拿结果。待改进：个人认知有进一步打开的空间，对品牌的深刻理解有提升空间。",
                "小狼,B,B,C,B,B,C,B,B,C,好的：全力以赴拿结果，主动探索品牌独特性。待改进：对品牌理解的通透性有提升空间。",
                "念念,B,B,C,B,B,C,B,C,C,好的：有创业者心态，全力以赴拿结果。待改进：团队沟通有提升空间。",
                "粉墨,B,B,B,B,B,C,B,B,C,好的：全力以赴，身体力行拿结果，在男士品牌上有成果。待改进：体系化能力有提升空间，职业化沟通能力有提升空间。",
                "镙钉,B,B,C,B,B,C,B,B,C,好的：全力以赴，主动推动各项工作。待改进：与岗位匹配的职业素养有提升空间，对组织文化标签的打造管理有提升空间。",
                "小小,B,C,C,B,B,C,B,B,C,好的：尽心尽力拿结果。待改进：专业能力、管理能力、职业化能力有提升空间。",
                "长征,B,C,C,B,B,C,B,B,C,好的：尽心尽力拿结果。待改进：管理能力、专业能力、主动接近深层次问题，有提升空间。",
                "无涯,B,B,C,B,B,B,B,B,C,好的：全力以赴，身体力行拿结果。待改进：与岗位匹配的职业化素养和专业度有提升空间。",
                "竹霖,B,B,C,B,B,C,B,B,C,好的：尽心尽力、公正客观站岗控制风险。待改进：沟通方法有提升空间，促进组织提效有提升空间。",
                "东方,B,C,C,B,B,C,B,B,C,好的：全力以赴，身体力行拿结果。待改进：管理人的方法、管理目标的方法有很大改进空间。",
                "惊鸿,B,B,C,B,B,B,B,B,C,好的：全力以赴，身体力行融入业务拿结果。待改进：带领团队拿结果促进业务更好发展的空间很大。",
                "秋风,B,B,C,B,B,C,B,B,C,好的：全力以赴，有责任心。待改进：带领团队拿结果促进业务更好发展的空间非常大。",
                "元三,B,C,C,B,B,C,B,B,C,好的：能够皮实的面对问题，责任心及协作力较前期有提升。待改进：细心把控和专业能力有提升空间。"*/
                "香叶,B,B,B,B,B,B,B,B,C,暂无其他建议"
        };
        for (String line : assessmentLines) {
            String[] parts = line.split(",");
            String evaluatedPerson = parts[0];
            List<String> answers = Arrays.asList(Arrays.copyOfRange(parts, 1, parts.length));
            ASSESSMENT_RESULT_DATA.put(evaluatedPerson, answers);
        }
    }

    // 根据题目序号获取题目 ID
    private static String getQuestionIdBySerialNumber(String serialNumber) {
        for (Map.Entry<String, Map<String, String>> entry : QUESTION_BASE_DATA.entrySet()) {
            String questionId = entry.getKey();
            Map<String, String> questionInfo = entry.getValue();
            if (serialNumber.equals(questionInfo.get("question_serial_number"))) {
                return questionId;
            }
        }
        return null;
    }

    // 将答案（ABCD）转换为选项编号
    private static int convertAnswerToOptionNumber(String answer) {
        switch (answer) {
            case "A":
                return 1;
            case "B":
                return 2;
            case "C":
                return 3;
            case "D":
                return 4;
            default:
                throw new IllegalArgumentException("Invalid answer: " + answer);
        }
    }

    /**
     * 生成不重复的字符串格式的 ID
     * @return 不重复的字符串格式的 ID
     */
    public static String generateUniqueId() {
        // 获取当前时间戳，并格式化为 14 位的日期时间字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String timestampPart = sdf.format(new Date());

        // 生成 4 位随机数
        Random random = new Random();
        int randomNum = random.nextInt(9000) + 1000; // 生成 1000 - 9999 之间的随机数
        String randomPart = String.valueOf(randomNum);

        // 拼接时间戳部分和随机数部分，组成 18 位 ID
        return timestampPart + randomPart;
    }

    // 生成插入 SQL 语句
    private static String generateInsertSql(String id, String taskId, String actionId, String evaluateId,
                                            String beEvaluatedId, String questionAnswer, String questionId,
                                            String optionAnswer, String currentDate, String checkId) {
        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO syounger.kpi_evaluate_answer\n");
        sql.append("(id, task_id, action_id, evaluate_id, be_evaluate_id, question_answer, del_flag, question_id, plan_id, option_answer, reason, create_by, create_date, update_by, update_date, check_id)\n");
        sql.append("VALUES(");
        sql.append("'").append(id).append("', ");
        sql.append("'").append(taskId).append("', ");
        sql.append("'").append(actionId).append("', ");
        sql.append("'").append(evaluateId).append("', ");
        sql.append("'").append(beEvaluatedId).append("', ");
        if (questionAnswer != null) {
            sql.append("'").append(questionAnswer).append("', ");
        } else {
            sql.append("NULL, ");
        }
        sql.append("0, ");
        sql.append("'").append(questionId).append("', ");
        sql.append("925084110167746562, ");
        if (optionAnswer != null) {
            sql.append("'").append(optionAnswer).append("', ");
        } else {
            sql.append("NULL, ");
        }
        sql.append("NULL, ");
        sql.append("1, ");
        sql.append("'").append(currentDate).append("', ");
        sql.append("1, ");
        sql.append("'").append(currentDate).append("', ");
        sql.append("'").append(checkId).append("');");
        return sql.toString();
    }
}
